package com.xhh.nphm.web.controller.system.api;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.xhh.nphm.common.core.controller.BaseController;
import com.xhh.nphm.common.core.domain.AjaxResult;
import com.xhh.nphm.common.core.domain.entity.SysUser;
import com.xhh.nphm.common.core.domain.entity.annotation.MultiRequestBody;
import com.xhh.nphm.common.utils.BaiduApiUtils;
import com.xhh.nphm.common.utils.http.HttpClientTools;
import com.xhh.nphm.system.domain.AiAnswer;
import com.xhh.nphm.system.domain.AiAnswerLog;
import com.xhh.nphm.system.domain.MwfSendBack;
import com.xhh.nphm.system.service.AiAnswerService;
import com.xhh.nphm.system.vo.AiAnsweringVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import java.io.IOException;
import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("/system/bdapi/intelligent")
public class QuestionAnsweringApiController extends BaseController {
    private final static String apiKey = "k7tD8RQH5Uphfc2vuaIGImrS";
    private final static String secretKey = "HlBaeAHWjTF1zUGMfF7H3ZLPe3IUs2nF";
    private final static String question_answering_url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=";
    private final static String access_token_url = "https://aip.baidubce.com/oauth/2.0/token?client_id="+apiKey+"&client_secret="+secretKey+"&grant_type=client_credentials";
    private final String prefix = "system/mTelRcd";
    @Autowired
    private AiAnswerService aiAnswerService;

    @Autowired
    private BaiduApiUtils baiduApi;

    /**
     * 智能问答
     * //TODO token可以考虑放到缓存中，方便下次使用
     * @param content
     * @return
     */
    @RequestMapping("/questionAnswering")
    public String questionAnswering(String content) {
        AiAnswer aiAnswer = aiAnswerService.selectByUserNo(getSysUser().getUserId());
        if (aiAnswer == null || aiAnswer.getNumsBig() <= 0){
            AjaxResult error = AjaxResult.error("次数超限！");
            return JSONObject.toJSONString(error);
        }
        String role = "user";
        // String token = getAccessToken();
        String token = "24.ecfe94f3c94a5d152c991ce9e7f203f7.2592000.1705134243.282335-44960825";
        String paramContent = "{\"messages\":[{\"role\":\""+role+"\",\"content\":\""+content+"\"}]}";
        JSONObject jsonObject = JSONObject.parseObject(paramContent);
        String url = question_answering_url + token;
        String result = null;
        try {
            result = HttpClientTools.doJsonPost(url, jsonObject.toJSONString());
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (aiAnswer.getNumsBig() > 0){
            aiAnswer.setNumsBig(aiAnswer.getNumsBig() - 1);
            updateAiAnswer(aiAnswer);
        }
        addAiAnsweringLog(content,"大模型解答");
        System.out.println(result);
        return result;
    }

    /**
     * 获取授权token
     * @return
     */
    @RequestMapping("getAccessToken")
    public String getAccessToken() {
        String result = null;
        try {
            result = HttpClientTools.doJsonPost(access_token_url, null);
            System.out.println(result);
            JSONObject jsonObject = JSONObject.parseObject(result);
            result = jsonObject.getString("access_token");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    public static void main(String[] args) {
        String content = "尊敬的各位领导：\n" +
                "过年好！\n" +
                "值此新春佳节之际，首先给你们拜个年，祝大家新年快乐，阖家团圆！之所以大过年的也打扰各位领导休息，是因我们难以维权讨公道的苦衷。2018年底我们遭遇网络诈骗，受骗金额达百万之多，承蒙市领导关注，成都市公安局郫都区刑侦大队接受此案并立案侦查，期盼中等来的消息是：犯罪人员魏伟经短期羁押后被释放了。我们没有拿回自己被骗的钱，甚至连一句交待、一个承诺都没有得到。听闻警方要求魏伟主动联系被害人把钱款悉数返还，我们期盼中等待一天又一天，但我们始终未接到魏伟打来的任何电话。焦灼等待中我们拨打了魏伟电话，他拒绝接听，并逐一将我们的电话号码拉黑，我们更换电话与之接通后，对方以检察院办案人员身份继续欺骗愚弄我们：魏伟未释放，我们检方正在调查你们这个刷单团伙，你们不要打这个电话了。我们一群素不相识受其欺诈的受害者怎么就成为“刷单团伙”了？天理昭昭岂能颠倒黑白？！愤懑中我们不断拨打魏伟电话，在偶尔接通的几个通话中魏伟再也无法隐瞒自己的身份，他告知我们：“警察主动释放了我，你们报了警，就找警察要钱去！”电话挂断后再也无法接通。 我们是一群普通老百姓，我们相信政府，我们尊重法律的权威，但我们不解的是：1、魏伟假冒警察身份骗取我们的信任并组织我们为其淘宝店铺刷单，且涉案金额巨大，法律为何不制裁他？2、魏伟以欺诈手段骗取我们受害人高达数百万的钱款哪里去了？3、既然警察要他偿还我们的血汗钱，为何不冻结他的个人资产？4、魏伟气焰嚣张，公然藐视法律（他说：“检察院的人是傻子！嫌麻烦不给我定罪”），难道他所言在警界任高官的舅舅导致了正常司法程序的中断？我们120名受害者家境平常，魏伟诈骗我们的钱款一些是我们辛苦积攒的血汗钱，一些是我们向亲友借贷的钱。如今，钱没了，我们也找不到魏伟，欲哭无泪，我们恳请监督司法公平公正，恳求政府保护我们受害人合法的私有财产权。我们希望知道咱们部门的领导都很忙，而且过年的时候某些岗位还得坚持值班，所以我也希望能多多留意一下我们的案件，希望能给我们一个满意的答复，不要让坏人继续为非作歹，危害社会，让这样的黑恶势力继续只手遮天，我也相信在当今习主席带领的社会主义和谐社会，不能放过一个坏人来破坏社会主义安定团结！如果这件事情真的不了了之了，那么以后大家不都是可以效仿了吗，随便诈骗，反正最后也不管，但是我绝对相信咱们政府是公平的，对于这样危害社会主义安定团结的违法分子一定会有严厉的惩罚的，所以请政府给我们广大受害群众一个满意的交代，谢谢！以下是魏伟之前的犯罪资料：\n" +
                "魏伟，微信昵称为“艾米.Mr”和“艾米”，男，现年35岁，四川省遂宁市船山区人，名下有一家天猫店铺，名为 “吉祥娃娃数码专营”。由于其长期组织刷单，不仅严重扰乱网络电商正常运营秩序，还欠下巨额债务，为了维持店铺运转获取更大利益，他打着 “我是jingcha”的旗号大肆借贷、融资，以绝对安全保本投资骗得众人为其又购得一天猫店铺，简称“然魅”。伴随着债主及刷手们的讨还借款、索要返款的是魏伟明里暗里的谩骂及恐吓（其的电话号码被其称之为警用设备），受害者迫于其“jingcha”身份而不得不屈服于其淫威之下，苦苦哀求中方能拿回一点点欠款。“双十一”后，我们找到了魏伟名下“然魅”天猫店铺的股东方知股东们也苦不堪言、控告无门：魏伟骗他们“股东”买的店铺没有了，还私自以店铺名义借贷60多万挪作他用，魏伟负债累累！面对各方搜集的消息，我们此时才意识到自己遭遇了诈骗：魏伟没有钱，却以其高佣回报诱骗我们帮他店铺刷单，当我们在他授意下“确认收货”要求返款时，他以各种理由、借口不返款，我们申请淘宝退款想要拿回自己的本金，魏伟拒绝退款从而占有我们的本金。\n" +
                "魏伟以“jingcha”身份招摇撞骗，并以多种形式欺骗不同受害人，非法侵占受害人的财产，为避免更多人受骗，现将其公布于众，希望得到相关部门重视，为维护司法的公平公正，我们愿意配合公检法调查取证将其绳之於法。\n" +
                "                            受害人：xxx";
        long start = System.currentTimeMillis();
        QuestionAnsweringApiController apiController = new QuestionAnsweringApiController();
        apiController.questionAnswering(content);
        long end = System.currentTimeMillis();
        int seconds = (int) ((end-start)/1000);
        System.out.println("耗时"+seconds+"秒");
    }

    /**
     * 智能问答页面
     * @param map
     * @return
     */
    @GetMapping("/ai")
    public ModelAndView aiAnswering(ModelMap map){
        SysUser sysUser = getSysUser();
        map.put("user",sysUser);
        AiAnswer aiAnswer = aiAnswerService.selectByUserNo(sysUser.getUserId());
        if (aiAnswer != null){
            map.put("isOpen", aiAnswer.getIsOpen()); //是否开启
            map.put("timesAll", aiAnswer.getTimesAll()); //总次数
            map.put("timesDay", aiAnswer.getTimesDay()); //每天总次数
            map.put("numsBig", aiAnswer.getNumsBig()); //大模型次数
        }else{
            map.put("isOpen",1);//否则无权限
            map.put("timesAll", 0);
            map.put("timesDay", 0);
            map.put("numsBig", 0);
        }
        return new ModelAndView(prefix + "/aiAnswering");
    }

    /**
     * 智能问答
     * @param params 参数实体
     * @return
     */
    @PostMapping("/questions")
    private AjaxResult questions(AiAnsweringVO params){
        String data = "";
        AiAnswer aiAnswer = aiAnswerService.selectByUserNo(getSysUser().getUserId());
        if (aiAnswer != null){
            if (aiAnswer.getTimesAll() > 0){
                if (aiAnswer.getTimesDay() == 0){
                    aiAnswer.setTimesAll(aiAnswer.getTimesAll() - 1);
                    aiAnswer.setTimesDay(0);
                    aiAnswer.setTimes(aiAnswer.getTimes() + 1);
                    aiAnswer.setTimesUsed(aiAnswer.getTimesUsed() + 1);
                    data = baiduApi.questions(params);
                }else if(aiAnswer.getTimesDay() < 0){
                    return AjaxResult.error("次数超限！");
                }
            }else if(aiAnswer.getTimesAll() == 0){
                if (aiAnswer.getTimesDay() > 0){
                    aiAnswer.setTimesAll(0);
                    aiAnswer.setTimesDay(aiAnswer.getTimesDay() - 1);
                    aiAnswer.setTimes(aiAnswer.getTimes() + 1);
                    aiAnswer.setTimesUsed(aiAnswer.getTimesUsed() + 1);
                    data = baiduApi.questions(params);
                }else{
                    return AjaxResult.error("次数超限！");
                }
            }else{
                return AjaxResult.error("出错了！");
            }
        }else{
            return AjaxResult.error("无使用权限！");
        }
        if (data != null && updateAiAnswer(aiAnswer)){
            addAiAnsweringLog(params.getQuestion(),"智能问答");
        }
        return AjaxResult.success(JSONObject.parseObject(data));
    }

    /**
     * 获取位置信息
     * @param params 参数
     * @return
     */
    @PostMapping("/getPositionByName")
    private AjaxResult getPositionByName(@MultiRequestBody String params){
        return AjaxResult.success(JSONObject.parseObject(baiduApi.getPositionByName(params)));
    }

    private boolean updateAiAnswer(AiAnswer aiAnswer){
        UpdateWrapper<AiAnswer> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("nums_big",aiAnswer.getNumsBig())
                .set("times_all",aiAnswer.getTimesAll())
                .set("times_day",aiAnswer.getTimesDay())
                .set("times_used",aiAnswer.getTimesUsed())
                .set("times",aiAnswer.getTimes())
                .set("opt_time",new Date())
                .eq("pkId",aiAnswer.getPkId());
        return aiAnswerService.update(updateWrapper);
    }

    /**
     * 定时任务：每天一点更新times
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void updateUseTimes() {
        List<AiAnswer> aiAnswers = aiAnswerService.selectAllConf();
        for (AiAnswer aiAnswer : aiAnswers) {
            aiAnswer.setTimes(0);
            updateAiAnswer(aiAnswer);
        }
    }


    /**
     * 记录接口日志
     * @param content 搜索内容
     * @param useType 使用类别
     */
    private void addAiAnsweringLog(String content,String useType){
        AiAnswerLog aiAnswerLog = new AiAnswerLog();
        SysUser sysUser = getSysUser();
        aiAnswerLog.setLogUserId(sysUser.getUserNo());
        aiAnswerLog.setLogUserName(sysUser.getUserName());
        aiAnswerLog.setLogDeptId(sysUser.getDeptId().toString());
        aiAnswerLog.setLogDeptName(sysUser.getDeptName());
        aiAnswerLog.setLogTime(new Date());
        aiAnswerLog.setLogContent(content);
        aiAnswerLog.setIsDel(0);
        aiAnswerLog.setUseType(useType);
        aiAnswerService.addAiAnswerLog(aiAnswerLog);
    }
}
